home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / robot.s < prev    next >
Text File  |  1997-01-31  |  14KB  |  931 lines

  1. ROBFRAME: dc.w 0
  2.  
  3. ItsARobot:
  4.  
  5. *******************************
  6. ; cmp.b #4,numlives(a0)
  7. ; blt.s .oklives
  8. ; move.b #4,numlives(a0)
  9. ;.oklives
  10. *******************************
  11.  
  12.  tst.b NASTY
  13.  bne .yesnas
  14.  move.w #-1,12(a0)
  15.  rts
  16. .yesnas:
  17.  
  18.  move.w Facing(a0),d0
  19.  sub.w #2048,d0
  20.  and.w #8190,d0
  21.  move.w d0,Facing(a0)
  22.  
  23.  move.w #100,d0
  24.  jsr FindCloseRoom
  25.  clr.b exitfirst
  26.  
  27.  sub.b #1,worry(a0)
  28.  
  29.  move.w #160,extlen
  30.  move.b #2,awayfromwall
  31.  
  32.  move.l #20*256,StepUpVal
  33.  move.l #160*128,thingheight
  34.  move.l #20*256,StepDownVal
  35.  
  36.  move.w 12(a0),d2
  37.  bge.s .stillalive
  38. .notthisone:
  39.  rts
  40. .stillalive:
  41.  
  42.  tst.b numlives(a0)
  43.  bgt.s .notdying
  44.  
  45.  move.b #0,numlives(a0)
  46.  
  47. .onfloordead:
  48.  move.b #-1,16(a0)
  49.  rts
  50.  
  51. .notdying: 
  52.  
  53. ;
  54. ; movem.l d0-d7/a0-a6,-(a7)
  55. ;
  56. ; move.w (a0),d0
  57. ; move.l #ObjRotated,a1
  58. ; move.l (a1,d0.w*8),Noisex
  59. ; move.w #400,Noisevol
  60. ; move.w #7,Samplenum
  61. ; move.b #1,chanpick
  62. ; move.b 1(a0),IDNUM
  63. ; clr.b notifplaying
  64. ; jsr MakeSomeNoise
  65. ; movem.l (a7)+,d0-d7/a0-a6
  66. ;
  67. ;.nosound:
  68.  
  69.  move.w #10,maxspd(a0)
  70.  
  71.  move.w ROBFRAME,d0
  72.  add.w TempFrames,d0
  73.  cmp.w #43,d0
  74.  blt.s .noresanim
  75.  moveq #0,d0
  76. .noresanim:
  77.  move.w d0,ROBFRAME
  78.  asr.w #1,d0
  79.  move.w d0,10(a0)
  80.  
  81.  move.w #70,nasheight
  82.  
  83.  tst.b 17(a0)
  84.  beq.s .cantseeplayer
  85.   
  86.  tst.w ThirdTimer(a0)
  87.  ble ROBAttack_Player
  88.  move.w TempFrames,d0
  89.  sub.w d0,ThirdTimer(a0)
  90.  bge .waitandsee
  91.  move.w #0,ThirdTimer(a0)
  92.  bra .waitandsee
  93.  
  94. .cantseeplayer 
  95.  
  96.  jsr GetRand
  97.  lsr.w #4,d0
  98.  and.w #63,d0
  99.  add.w #20,d0
  100.  move.w d0,ThirdTimer(a0)
  101.  
  102. .waitandsee:
  103.  
  104.  move.w #30,FourthTimer(a0)
  105.  
  106.  move.l ZoneAdds,a5
  107.  move.l (a5,d2.w*4),d0
  108.  add.l LEVELDATA,d0
  109.  move.l d0,objroom
  110.  
  111.  move.w TempFrames,d0
  112.  sub.w d0,ObjTimer(a0)
  113.  bgt.s .nonewdir
  114.  
  115.  tst.b 17(a0)
  116.  beq.s .keepwandering
  117.  
  118.  bra ROBAttack_Player
  119.  
  120. .keepwandering
  121.  
  122.  jsr GetRand
  123.  and.w #8190,d0
  124.  move.w d0,CurrCPt(a0)
  125.  
  126.  jsr GetRand
  127.  and.w #63,d0
  128.  add.w #100,d0
  129.  move.w d0,ObjTimer(a0)
  130.  
  131. .nonewdir
  132.  
  133.  move.w CurrCPt(a0),d3
  134.  move.l #SineTable,a2
  135.  add.w d3,a2
  136.  move.w (a2),d2
  137.  move.w 2048(a2),d1
  138.  
  139.  move.w Facing(a0),d3
  140.  move.l #SineTable,a2
  141.  move.w 120(a2),d6
  142.  swap d6
  143.  clr.w d6
  144.  asr.l #1,d6
  145.  lea (a2,d3.w),a2
  146.  move.w (a2),d4    ; sin
  147.  move.w 2048(a2),d5 ; cos
  148.  muls d2,d5
  149.  muls d1,d4
  150.  
  151.  moveq #0,d3
  152.  
  153.  sub.l d5,d4
  154.  blt.s .turnrighty
  155. .turnlefty:
  156.  
  157.  cmp.l d4,d6
  158.  bgt.s .doneturn
  159.  
  160.  move.w #-120,d3
  161.  
  162.  bra.s .doneturn
  163. .turnrighty:
  164.  
  165.  neg.l d4
  166.  cmp.l d4,d6
  167.  bgt.s .doneturn
  168.  
  169.  move.w #120,d3
  170.  
  171. .doneturn:
  172.  
  173.  
  174.  muls 2048(a2),d1
  175.  muls (a2),d2
  176.  add.l d2,d1
  177.  cmp.l #$20000000,d1
  178.  bgt.s .canwalk
  179.  move.w #0,maxspd(a0)
  180.  
  181.  add.w d3,d3
  182.  bne.s .canwalk
  183.  move.w #240,d3
  184.  
  185. .canwalk:
  186.  
  187.  add.w Facing(a0),d3
  188.  
  189.  and.w #8191,d3
  190.  
  191.  move.w d3,Facing(a0)
  192.  
  193.  move.w (a0),d1
  194.  move.l ObjectPoints,a1
  195.  lea (a1,d1.w*8),a1
  196.  move.w (a1),oldx 
  197.  move.w 4(a1),oldz
  198.  
  199.  move.w maxspd(a0),d2
  200.  muls TempFrames,d2
  201.  move.w d2,speed
  202.  move.w #300,Range
  203.  
  204.  move.w 4(a0),d0
  205.  ext.l d0
  206.  asl.l #7,d0
  207.  sub.w #40*128,d0
  208.  move.l d0,newy
  209.  move.l d0,oldy
  210.  
  211.  move.b ObjInTop(a0),StoodInTop
  212.  
  213.  movem.l a6/d0/a0/a1/a3/a4/d7,-(a7)
  214.  clr.b canshove
  215.  move.w Facing(a0),d0
  216.  jsr GoInDirection
  217.  move.w #%1000000000,wallflags
  218.  clr.b wallbounce
  219.  Jsr MoveObject
  220.  movem.l (a7)+,a6/d0/a0/a1/a3/a4/d7
  221.  
  222.  move.b StoodInTop,ObjInTop(a0)
  223.  
  224.  tst.b hitwall
  225.  beq.s .nochangedir
  226.  move.w #-1,ObjTimer(a0)
  227. .nochangedir:
  228.  
  229.  move.l objroom,a2
  230.  move.w (a2),d0
  231.  move.w d0,12(a0)
  232.  move.l #ZoneBrightTable,a5
  233.  move.l (a5,d0.w*4),d0
  234.  tst.b ObjInTop(a0)
  235.  bne.s .okbit
  236.  swap d0
  237. .okbit:
  238.  move.w d0,2(a0)
  239.  
  240.  move.w newx,(a1)
  241.  move.w newz,4(a1)
  242.  
  243.  move.l ToZoneFloor(a2),d0
  244.  tst.b ObjInTop(a0)
  245.  beq.s .notintop
  246.  move.l ToUpperFloor(a2),d0
  247. .notintop:
  248.  asr.l #7,d0
  249.  sub.w #120,d0
  250.  move.w d0,4(a0)
  251.  
  252.  moveq #0,d2
  253.  move.b damagetaken(a0),d2
  254.  asr.b #4,d2
  255.  beq .noscream
  256.  
  257.  sub.b d2,numlives(a0)
  258.  bgt.s .notdeadyet
  259.  
  260.  movem.l d0-d7/a0-a6,-(a7)
  261.  sub.l ObjectPoints,a1
  262.  add.l #ObjRotated,a1
  263.  move.l (a1),Noisex
  264.  move.w #400,Noisevol
  265.  move.w #15,Samplenum
  266.  move.b #1,chanpick
  267.  clr.b notifplaying
  268.  st backbeat
  269.  move.b 1(a0),IDNUM
  270.  jsr MakeSomeNoise
  271.  
  272.  move.w #120,d0
  273.  bsr ComputeBlast
  274.  
  275.  movem.l (a7)+,d0-d7/a0-a6
  276.  
  277.  move.b #4,16(a0)
  278.  move.b #%1000,17(a0)
  279.  move.l #$50003,8(a0)
  280.  move.w #$2020,6(a0)
  281.  move.w #$1010,14(a0)
  282.  
  283.  
  284.  rts
  285.  
  286. .notdeadyet:
  287.  clr.b damagetaken(a0)
  288.  
  289.  movem.l d0-d7/a0-a6,-(a7)
  290.  sub.l ObjectPoints,a1
  291.  add.l #ObjRotated,a1
  292.  move.l (a1),Noisex
  293.  move.w #200,Noisevol
  294.  move.w #8,Samplenum
  295.  move.b #1,chanpick
  296.  clr.b notifplaying
  297.  move.b 1(a0),IDNUM
  298.  st backbeat
  299.  jsr MakeSomeNoise
  300.  movem.l (a7)+,d0-d7/a0-a6
  301.  
  302. .noscream
  303.  
  304.  move.b ObjInTop(a0),ViewerTop
  305.  move.b PLR1_StoodInTop,TargetTop
  306.  move.l PLR1_Roompt,ToRoom
  307.  move.l objroom,FromRoom
  308.  move.w newx,Viewerx
  309.  move.w newz,Viewerz
  310.  move.b ObjInTop(a0),ViewerTop
  311.  move.b PLR1_StoodInTop,TargetTop
  312.  move.w PLR1_xoff,Targetx
  313.  move.w PLR1_zoff,Targetz
  314.  
  315.  move.l PLR1_yoff,d0
  316.  asr.l #7,d0
  317.  move.w d0,Targety
  318.  
  319.  move.w 4(a0),Viewery
  320.  
  321.  move.w Facing(a0),Facedir
  322.  jsr CanItBeSeen
  323.  
  324.  tst.b CanSee
  325.  beq .carryonprowling
  326.  
  327.  move.b #1,17(a0)
  328.  
  329. .carryonprowling:
  330.  
  331.  move.b ObjInTop(a0),ViewerTop
  332.  move.b PLR2_StoodInTop,TargetTop
  333.  move.l PLR2_Roompt,ToRoom
  334.  move.l objroom,FromRoom
  335.  move.w newx,Viewerx
  336.  move.w newz,Viewerz
  337.  move.w p2_xoff,Targetx
  338.  move.w p2_zoff,Targetz
  339.  move.b ObjInTop(a0),ViewerTop
  340.  move.b PLR2_StoodInTop,TargetTop
  341.  move.l p2_yoff,d0
  342.  asr.l #7,d0
  343.  move.w d0,Targety
  344.  move.w 4(a0),Viewery
  345.  jsr CanItBeSeen
  346.  
  347.  tst.b CanSee
  348.  beq .carryonprowling2
  349.  
  350.  or.b #2,17(a0)
  351.  
  352. .carryonprowling2:
  353.  
  354.  move.w Facing(a0),d0
  355.  add.w #2048,d0
  356.  and.w #8190,d0
  357.  move.w d0,Facing(a0)
  358.  
  359.  
  360. .thisonedead:
  361.  rts
  362.  
  363. p_xoff: dc.l 0
  364. p_zoff: dc.l 0
  365. p_yoff: dc.l 0
  366. p_Roompt: dc.l 0
  367.  
  368. ROBAttack_Player:
  369.  
  370.  move.w TempFrames,d0
  371.  sub.w d0,FourthTimer(a0)
  372.  
  373.  btst #0,17(a0)
  374.  beq MUSTPLR2
  375.  btst #1,17(a0)
  376.  bne.s COULDBE
  377.  
  378.  bra MUSTPLR1
  379.  
  380. COULDBE:
  381.  move.l ObjectPoints,a1
  382.  move.w (a0),d0
  383.  move.w (a1,d0.w*8),d1
  384.  move.w 4(a1,d0.w*8),d2
  385.  
  386.  move.w PLR1_xoff,d3
  387.  move.w PLR1_zoff,d4
  388.  
  389.  sub.w d1,d3
  390.  sub.w d2,d4
  391.  
  392.  muls d3,d3
  393.  muls d4,d4
  394.  add.l d4,d3
  395.  move.w PLR2_xoff,d4
  396.  move.w PLR2_zoff,d5
  397.  sub.w d1,d4
  398.  sub.w d2,d5
  399.  muls d4,d4
  400.  muls d5,d5
  401.  add.l d5,d4
  402.  cmp.l d3,d4
  403.  ble MUSTPLR2
  404.  
  405. MUSTPLR1:
  406.  
  407.  move.w 12(a0),d2
  408.  move.l ZoneAdds,a5
  409.  move.l (a5,d2.w*4),d0
  410.  add.l LEVELDATA,d0
  411.  move.l d0,objroom
  412.  
  413.  move.w PLR1_xoff,newx
  414.  move.w PLR1_zoff,newz
  415.  move.w (a0),d1
  416.  move.l #ObjRotated,a6
  417.  move.l ObjectPoints,a1
  418.  lea (a1,d1.w*8),a1
  419.  lea (a6,d1.w*8),a6
  420.  move.w (a1),oldx
  421.  move.w 4(a1),oldz
  422.  move.w maxspd(a0),d2
  423.  muls.w TempFrames,d2
  424.  move.w d2,speed
  425.  move.w #300,Range
  426.  move.w 4(a0),d0
  427.  ext.l d0
  428.  asl.l #7,d0
  429.  sub.l #40*128,d0
  430.  move.l d0,newy
  431.  move.l d0,oldy
  432.  
  433.  move.b ObjInTop(a0),StoodInTop
  434.  movem.l a6/d0/a0/a1/a3/a4/d7,-(a7)
  435.  clr.b canshove
  436.  clr.b GotThere
  437.  jsr HeadTowardsAng
  438.  move.w #%1000000000,wallflags
  439.  clr.b wallbounce
  440.  Jsr MoveObject
  441.  movem.l (a7)+,a6/d0/a0/a1/a3/a4/d7
  442.  move.b StoodInTop,ObjInTop(a0)
  443.  
  444.  move.w CosRet,d1
  445.  move.w SinRet,d2
  446.  move.w Facing(a0),d3
  447.  move.l #SineTable,a2
  448.  move.w 120(a2),d6
  449.  swap d6
  450.  clr.w d6
  451.  asr.l #1,d6
  452.  lea (a2,d3.w),a2
  453.  move.w (a2),d4    ; sin
  454.  move.w 2048(a2),d5 ; cos
  455.  muls d2,d5
  456.  muls d1,d4
  457.  
  458.  moveq #0,d3
  459.  
  460.  sub.l d5,d4
  461.  blt.s .turnrighty2
  462. .turnlefty2:
  463.  
  464.  cmp.l d4,d6
  465.  bgt.s .doneturn2
  466.  
  467.  move.w #-240,d3
  468.  
  469.  bra.s .doneturn2
  470. .turnrighty2:
  471.  
  472.  neg.l d4
  473.  cmp.l d4,d6
  474.  bgt.s .doneturn2
  475.  
  476.  move.w #240,d3
  477.  
  478. .doneturn2:
  479.  
  480.  move.w #4,maxspd(a0)
  481.  
  482.  muls 2048(a2),d1
  483.  muls (a2),d2
  484.  add.l d2,d1
  485.  cmp.l #$20000000,d1
  486.  sgt.s canshootgun
  487.  bgt.s .canwalk2
  488.  move.w #0,maxspd(a0)
  489.  
  490.  add.w d3,d3
  491.  bne.s .canwalk2
  492.  move.w #480,d3
  493.  
  494. .canwalk2:
  495.  
  496.  add.w Facing(a0),d3
  497.  
  498.  and.w #8191,d3
  499.  
  500.  move.w d3,Facing(a0)
  501.  
  502.  
  503.  move.l objroom,a2
  504.  move.w (a2),d0
  505.  move.w d0,12(a0)
  506.  move.l #ZoneBrightTable,a5
  507.  move.l (a5,d0.w*4),d0
  508.  tst.b ObjInTop(a0)
  509.  bne.s .okbit2
  510.  swap d0
  511. .okbit2:
  512.  sub.w #5,d0
  513.  move.w d0,2(a0)
  514.  
  515.  move.w newx,(a1)
  516.  move.w newz,4(a1)
  517.  
  518.  move.l ToZoneFloor(a2),d0
  519.  tst.b ObjInTop(a0)
  520.  beq.s .notintop2
  521.  move.l ToUpperFloor(a2),d0
  522. .notintop2:
  523.  asr.l #7,d0
  524.  sub.w #120,d0
  525.  move.w d0,4(a0)
  526.  
  527.  move.b damagetaken(a0),d2
  528.  asr.b #4,d2
  529.  beq .noscream2
  530.  
  531.  sub.b d2,numlives(a0)
  532.  bgt.s .notdeadyet2
  533.  
  534.  movem.l d0-d7/a0-a6,-(a7)
  535.  sub.l ObjectPoints,a1
  536.  add.l #ObjRotated,a1
  537.  move.l (a1),Noisex
  538.  move.w #400,Noisevol
  539.  move.w #15,Samplenum
  540.  move.b #1,chanpick
  541.  clr.b notifplaying
  542.  st backbeat
  543.  move.b 1(a0),IDNUM
  544.  jsr MakeSomeNoise
  545.  
  546.  move.w #400,d0
  547.  bsr ComputeBlast
  548.  
  549.  movem.l (a7)+,d0-d7/a0-a6
  550.  
  551.  move.b #4,16(a0)
  552.  move.b #%1000,17(a0)
  553.  move.l #$50003,8(a0)
  554.  move.w #$2020,6(a0)
  555.  move.w #$1010,14(a0)
  556.  
  557.  
  558.  rts 
  559.  
  560. .notdeadyet2:
  561.  clr.b damagetaken(a0)
  562.  
  563.  movem.l d0-d7/a0-a6,-(a7)
  564.  move.l (a6),Noisex
  565.  move.w #200,Noisevol
  566.  move.w #8,Samplenum
  567.  move.b #1,chanpick
  568.  clr.b notifplaying
  569.  st backbeat
  570.  move.b 1(a0),IDNUM
  571.  jsr MakeSomeNoise
  572.  movem.l (a7)+,d0-d7/a0-a6
  573.  
  574.  bra .cantshoot
  575.  
  576. .noscream2:
  577.  
  578.  tst.b canshootgun
  579.  beq .cantshoot
  580.  
  581.  cmp.w #20,FourthTimer(a0)
  582.  bge .cantshoot
  583.  
  584.  move.w #50,FourthTimer(a0)
  585.  
  586.  move.w ThirdTimer(a0),d0
  587.  sub.w #1,d0
  588.  cmp.w #-1,d0
  589.  bge.s .noreset
  590.  
  591.  jsr GetRand
  592.  lsr.w #4,d0
  593.  and.w #127,d0
  594.  add.w #150,d0
  595.  
  596. .noreset:
  597.  move.w d0,ThirdTimer(a0)
  598.  
  599.  move.w #9,Samplenum
  600.  move.b #4,SHOTTYPE
  601.  move.b #10,SHOTPOWER
  602.  move.w #16,SHOTSPEED
  603.  move.w #3,SHOTSHIFT
  604.  move.w #0,SHOTOFFMULT
  605.  move.l #0*128,SHOTYOFF
  606.  move.w #-100,2(a0)
  607.  
  608.  jsr FireAtPlayer1
  609.  
  610. .cantshoot:
  611.  
  612.  move.b #0,17(a0)
  613.  
  614.  move.l PLR1_Roompt,ToRoom
  615.  move.l objroom,FromRoom
  616.  move.w newx,Viewerx
  617.  move.w newz,Viewerz
  618.  move.w p1_xoff,Targetx
  619.  move.w p1_zoff,Targetz
  620.  move.b ObjInTop(a0),ViewerTop
  621.  move.b PLR1_StoodInTop,TargetTop
  622.  move.w Facing(a0),Facedir
  623.  move.l p1_yoff,d0
  624.  asr.l #7,d0
  625.  move.w d0,Targety
  626.  
  627.  move.w 4(a0),Viewery
  628.  
  629.  jsr CanItBeSeen
  630.  
  631.  tst.b CanSee
  632.  beq .carryonattack
  633.  
  634.  move.b #1,17(a0)
  635.  
  636. .carryonattack:
  637.  
  638.  move.l PLR2_Roompt,ToRoom
  639.  move.l objroom,FromRoom
  640.  move.w newx,Viewerx
  641.  move.w newz,Viewerz
  642.  move.w p2_xoff,Targetx
  643.  move.w p2_zoff,Targetz
  644.  move.w Facing(a0),Facedir
  645.  move.b ObjInTop(a0),ViewerTop
  646.  move.b PLR2_StoodInTop,TargetTop
  647.  move.l p2_yoff,d0
  648.  asr.l #7,d0
  649.  move.w d0,Targety
  650.  
  651.  move.w 4(a0),Viewery
  652.  
  653.  jsr CanItBeSeen
  654.  
  655.  tst.b CanSee
  656.  beq .carryonattack2
  657.  
  658.  or.b #2,17(a0)
  659.  
  660. .carryonattack2:
  661.  move.w Facing(a0),d0
  662.  add.w #2048,d0
  663.  and.w #8190,d0
  664.  move.w d0,Facing(a0)
  665.  
  666.  rts
  667.  
  668. MUSTPLR2:
  669.  
  670.  move.w 12(a0),d2
  671.  move.l ZoneAdds,a5
  672.  move.l (a5,d2.w*4),d0
  673.  add.l LEVELDATA,d0
  674.  move.l d0,objroom
  675.  
  676.  move.w PLR2_xoff,newx
  677.  move.w PLR2_zoff,newz
  678.  move.w (a0),d1
  679.  move.l #ObjRotated,a6
  680.  move.l ObjectPoints,a1
  681.  lea (a1,d1.w*8),a1
  682.  lea (a6,d1.w*8),a6
  683.  move.w (a1),oldx
  684.  move.w 4(a1),oldz
  685.  move.w maxspd(a0),d2
  686.  muls.w TempFrames,d2
  687.  move.w d2,speed
  688.  move.w #300,Range
  689.  move.w 4(a0),d0
  690.  ext.l d0
  691.  asl.l #7,d0
  692.  sub.l #80*128,d0
  693.  move.l d0,newy
  694.  move.l d0,oldy
  695.  
  696.  move.b ObjInTop(a0),StoodInTop
  697.  movem.l a6/d0/a0/a1/a3/a4/d7,-(a7)
  698.  clr.b canshove
  699.  clr.b GotThere
  700.  jsr HeadTowardsAng
  701.  move.w #%1000000000,wallflags
  702.  clr.b wallbounce
  703.  Jsr MoveObject
  704.  movem.l (a7)+,a6/d0/a0/a1/a3/a4/d7
  705.  move.b StoodInTop,ObjInTop(a0)
  706.  
  707.  move.w CosRet,d1
  708.  move.w SinRet,d2
  709.  move.w Facing(a0),d3
  710.  move.l #SineTable,a2
  711.  move.w 120(a2),d6
  712.  swap d6
  713.  clr.w d6
  714.  asr.l #1,d6
  715.  lea (a2,d3.w),a2
  716.  move.w (a2),d4    ; sin
  717.  move.w 2048(a2),d5 ; cos
  718.  muls d2,d5
  719.  muls d1,d4
  720.  
  721.  moveq #0,d3
  722.  
  723.  sub.l d5,d4
  724.  blt.s .turnrighty2
  725. .turnlefty2:
  726.  
  727.  cmp.l d4,d6
  728.  bgt.s .doneturn2
  729.  
  730.  move.w #-120,d3
  731.  
  732.  bra.s .doneturn2
  733. .turnrighty2:
  734.  
  735.  neg.l d4
  736.  cmp.l d4,d6
  737.  bgt.s .doneturn2
  738.  
  739.  move.w #120,d3
  740.  
  741. .doneturn2:
  742.  
  743.  move.w #4,maxspd(a0)
  744.  
  745.  muls 2048(a2),d1
  746.  muls (a2),d2
  747.  add.l d2,d1
  748.  cmp.l #$20000000,d1
  749.  sgt.s canshootgun
  750.  bgt.s .canwalk2
  751.  move.w #0,maxspd(a0)
  752.  
  753.  add.w d3,d3
  754.  bne.s .canwalk2
  755.  move.w #240,d3
  756.  
  757. .canwalk2:
  758.  
  759.  add.w Facing(a0),d3
  760.  
  761.  and.w #8191,d3
  762.  
  763.  move.w d3,Facing(a0)
  764.  
  765.  
  766.  move.l objroom,a2
  767.  move.w (a2),d0
  768.  move.w d0,12(a0)
  769.  move.l #ZoneBrightTable,a5
  770.  move.l (a5,d0.w*4),d0
  771.  tst.b ObjInTop(a0)
  772.  bne.s .okbit2
  773.  swap d0
  774. .okbit2:
  775.  sub.w #5,d0
  776.  move.w d0,2(a0)
  777.  
  778.  move.w newx,(a1)
  779.  move.w newz,4(a1)
  780.  
  781.  move.l ToZoneFloor(a2),d0
  782.  tst.b ObjInTop(a0)
  783.  beq.s .notintop2
  784.  move.l ToUpperFloor(a2),d0
  785. .notintop2:
  786.  asr.l #7,d0
  787.  sub.w #120,d0
  788.  move.w d0,4(a0)
  789.  
  790.  move.b damagetaken(a0),d2
  791.  asr.b #4,d2
  792.  beq .noscream2
  793.  
  794.  sub.b d2,numlives(a0)
  795.  bgt.s .notdeadyet2
  796.  
  797.  movem.l d0-d7/a0-a6,-(a7)
  798.  sub.l ObjectPoints,a1
  799.  add.l #ObjRotated,a1
  800.  move.l (a1),Noisex
  801.  move.w #400,Noisevol
  802.  move.w #15,Samplenum
  803.  move.b #1,chanpick
  804.  clr.b notifplaying
  805.  st backbeat
  806.  move.b 1(a0),IDNUM
  807.  jsr MakeSomeNoise
  808.  
  809.  move.w #400,d0
  810.  bsr ComputeBlast
  811.  
  812.  movem.l (a7)+,d0-d7/a0-a6
  813.  
  814.  move.b #4,16(a0)
  815.  move.b #%1000,17(a0)
  816.  move.l #$50003,8(a0)
  817.  move.w #$2020,6(a0)
  818.  move.w #$1010,14(a0)
  819.  
  820.  rts 
  821.  
  822. .notdeadyet2:
  823.  clr.b damagetaken(a0)
  824.  
  825.  movem.l d0-d7/a0-a6,-(a7)
  826.  move.l (a6),Noisex
  827.  move.w #200,Noisevol
  828.  move.w #8,Samplenum
  829.  move.b #1,chanpick
  830.  clr.b notifplaying
  831.  st backbeat
  832.  move.b 1(a0),IDNUM
  833.  jsr MakeSomeNoise
  834.  movem.l (a7)+,d0-d7/a0-a6
  835.  
  836.  bra .cantshoot
  837.  
  838. .noscream2:
  839.  
  840.  tst.b canshootgun
  841.  beq .cantshoot
  842.  
  843.  cmp.w #20,FourthTimer(a0)
  844.  bge .cantshoot
  845.  
  846.  move.w #50,FourthTimer(a0)
  847.  
  848.  move.w ThirdTimer(a0),d0
  849.  sub.w #1,d0
  850.  cmp.w #-2,d0
  851.  bge.s .noreset
  852.  
  853.  jsr GetRand
  854.  and.w #127,d0
  855.  add.w #100,d0
  856.  
  857. .noreset:
  858.  move.w d0,ThirdTimer(a0)
  859.  
  860.  move.w #9,Samplenum
  861.  move.b #4,SHOTTYPE
  862.  move.b #10,SHOTPOWER
  863.  move.w #16,SHOTSPEED
  864.  move.w #3,SHOTSHIFT
  865.  move.w #0,SHOTOFFMULT
  866.  move.l #0*128,SHOTYOFF
  867.  move.w #-100,2(a0)
  868.  
  869.  jsr FireAtPlayer2
  870.  
  871. .cantshoot:
  872.   
  873.  move.b #0,17(a0)
  874.  
  875.  move.l PLR1_Roompt,ToRoom
  876.  move.l objroom,FromRoom
  877.  move.w newx,Viewerx
  878.  move.w newz,Viewerz
  879.  move.w p1_xoff,Targetx
  880.  move.w p1_zoff,Targetz
  881.  move.b ObjInTop(a0),ViewerTop
  882.  move.b PLR1_StoodInTop,TargetTop
  883.  move.w Facing(a0),Facedir
  884.  move.l p1_yoff,d0
  885.  asr.l #7,d0
  886.  move.w d0,Targety
  887.  
  888.  move.w 4(a0),Viewery
  889.  
  890.  jsr CanItBeSeen
  891.  
  892.  tst.b CanSee
  893.  beq .carryonattack
  894.  
  895.  move.b #1,17(a0)
  896.  
  897. .carryonattack:
  898.  
  899.  move.l PLR2_Roompt,ToRoom
  900.  move.l objroom,FromRoom
  901.  move.w newx,Viewerx
  902.  move.w newz,Viewerz
  903.  move.w p2_xoff,Targetx
  904.  move.w p2_zoff,Targetz
  905.  move.b ObjInTop(a0),ViewerTop
  906.  move.b PLR2_StoodInTop,TargetTop
  907.  move.w Facing(a0),Facedir
  908.  move.l p2_yoff,d0
  909.  asr.l #7,d0
  910.  move.w d0,Targety
  911.  
  912.  move.w 4(a0),Viewery
  913.  
  914.  jsr CanItBeSeen
  915.  
  916.  tst.b CanSee
  917.  beq .carryonattack2
  918.  
  919.  or.b #2,17(a0)
  920.  
  921. .carryonattack2:
  922.  move.w Facing(a0),d0
  923.  add.w #2048,d0
  924.  and.w #8190,d0
  925.  move.w d0,Facing(a0)
  926.  
  927.  rts
  928.  
  929.  
  930. canshootgun: dc.w 0